snippets of code taken from:
https://github.com/danielwrobert/vagrant-LEMP/blob/master/provision/setup.sh
https://github.com/panique/vagrant-lamp-bootstrap
This will install Ubuntu 16.04, NGINX, MariaDB, PHP7-FPM and Git
1. Initialize Vagrant
$ vagrant init bento/ubuntu-16.04
2. Edit Vagrantfile
Next, edit Vagrantfile and make it look something like this below (without the commented lines). This will create a symbolic link from the root folder with Vagrantfile in it >> to the virtual machine's ‘/var/www' folder with group and owner ‘www-data'. In the provisioning script, we will add an html folder which will be the root of our projects:
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-16.04"
config.vm.network "forwarded_port", guest: 80, host: 80
config.vm.synced_folder "./", "/var/www", create: true, group: "www-data", owner: "www-data"
config.vm.provision "shell" do |s|
s.path = "bootstrap.sh"
end
end
3. Create a config directory
Inside your local root folder (where Vagrantfile is located) create a folder called ‘config'. Inside this root folder, you will now have a 1) ‘config' directory, 2) ‘.vagrant' directory, 3) ‘Vagrantfile' file.
4. Create the shell script
Inside the same local root folder (where Vagrantfile is located), create a file called ‘bootstrap.sh' and copy/paste the code below into it. Change the ‘PASSWORD' (and optionally PROJECTFOLDER) to whatever you like:
#!/bin/bash
# Using single quotes instead of double quotes to make it work with special-character passwords
PASSWORD='vagrant'
PROJECTFOLDER='html'
# create project folder
sudo mkdir "/var/www/${PROJECTFOLDER}"
# update / upgrade
echo "Updating apt-get..."
sudo apt-get update > /dev/null 2>&1
sudo apt-get -y upgrade > /dev/null 2>&1
# install git
echo "Installing Git..."
sudo apt-get install -y git > /dev/null 2>&1
# install nginx
echo "Installing Nginx..."
sudo apt-get install -y nginx > /dev/null 2>&1
# install php7-fpm
echo "Installing PHP..."
sudo apt-get install -y php-fpm php-mysql php-xml php-gd php7.0-zip > /dev/null 2>&1
# install mariadb and give password to installer
echo "Preparing MariaDB..."
sudo apt-get install -y debconf-utils > /dev/null 2>&1
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password password $PASSWORD"
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password_again password $PASSWORD"
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64,i386] http://sfo1.mirrors.digitalocean.com/mariadb/repo/10.3/ubuntu xenial main'
echo "Updating apt-get..."
sudo apt-get update > /dev/null 2>&1
echo "Installing MariaDB..."
sudo apt-get install -y mariadb-server
# Nginx Config
echo "Configuring Nginx..."
sudo cp /var/www/config/nginx_vhost /etc/nginx/sites-available/nginx_vhost > /dev/null 2>&1
sudo ln -s /etc/nginx/sites-available/nginx_vhost /etc/nginx/sites-enabled/
sudo rm -rf /etc/nginx/sites-enabled/default
# Restarting Nginx for config to take effect
echo "Restarting Nginx..."
sudo service nginx restart > /dev/null 2>&1
5. Configure NGINX server block
Inside the ‘config' directory, create a file and add the code below (in this case we name the file ‘nginx_vhost' which is also referenced in the code above):
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name localhost;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
6. Vagrant up
Finally, just vagrant up and let the script set up your virtual machine:
$ vagrant up
Alternative script that installs NGINX as reverse proxy for Apache, MariaDB, PHP7-FPM, Git and phpMyAdmin
ERRORS: Can't get phpmyadmin to install correctly and while apache and nginx install correctly, can't get them to work right.
#!/bin/bash
# Using single quotes instead of double quotes to make it work with special-character passwords
PASSWORD='12345678'
PROJECTFOLDER='html'
# create project folder
sudo mkdir "/var/www/${PROJECTFOLDER}"
# update / upgrade
echo "Updating apt-get..."
sudo apt-get update > /dev/null 2>&1
sudo apt-get -y upgrade > /dev/null 2>&1
# install git
echo "Installing Git..."
sudo apt-get install -y git > /dev/null 2>&1
# install nginx
echo "Installing Nginx..."
sudo apt-get install -y nginx > /dev/null 2>&1
# install php7-fpm
echo "Installing PHP..."
sudo apt-get install -y php-fpm php-mysql php-xml php-gd php7.0-zip > /dev/null 2>&1
# install mariadb and give password to installer
echo "Preparing MariaDB..."
sudo apt-get install -y debconf-utils > /dev/null 2>&1
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password password $PASSWORD"
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password_again password $PASSWORD"
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64,i386] http://sfo1.mirrors.digitalocean.com/mariadb/repo/10.3/ubuntu xenial main'
echo "Updating apt-get..."
sudo apt-get update > /dev/null 2>&1
echo "Installing MariaDB..."
sudo apt-get install -y mariadb-server
# Nginx Config
echo "Configuring Nginx..."
sudo cp /var/www/config/nginx_vhost /etc/nginx/sites-available/nginx_vhost > /dev/null 2>&1
sudo ln -s /etc/nginx/sites-available/nginx_vhost /etc/nginx/sites-enabled/
sudo rm -rf /etc/nginx/sites-enabled/default
# Restarting Nginx for config to take effect
echo "Restarting Nginx..."
sudo service nginx restart > /dev/null 2>&1
#install apache server for phpmyadmin
echo "Installing Apache..."
sudo apt-get install -y apache2 > /dev/null 2>&1
# setup hosts file
echo "Setting up host file..."
VHOST=$(cat <<EOF
<VirtualHost *:8000>
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
EOF
)
echo "${VHOST}" > /etc/apache2/sites-available/000-default.conf
# add the php index file to the first position
VMOD=$(cat <<EOF
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
EOF
)
echo "${VMOD}" > /etc/apache2/mods-enabled/dir.conf
# modify virtualhost port
echo "modifying apache port..."
VPORT=$(cat <<EOF
Listen 8000
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
EOF
)
echo "${VPORT}" > /etc/apache2/ports.conf
# install apache module which takes care of logging the correct ip
echo "Installing libapache2-mod-rpaf for IP logging..."
sudo apt-get install -y libapache2-mod-rpaf
# enable mod_rewrite
sudo a2enmod rewrite > /dev/null 2>&1
# restart apache
sudo service apache2 restart > /dev/null 2>&1
# install phpmyadmin and give password(s) to installer
# for simplicity, the same password is used for mariadb and phpmyadmin
echo "Preparing phpmyadmin..."
sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/dbconfig-install boolean true"
sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/app-password-confirm password $PASSWORD"
sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/mariadb/admin-pass password $PASSWORD"
sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/mariadb/app-pass password $PASSWORD"
sudo debconf-set-selections <<< "phpmyadmin phpmyadmin/reconfigure-webserver multiselect none"
echo "Installing phpmyadmin..."
sudo apt-get install -y phpmyadmin
echo "Installing php7.0-mcrypt..."
sudo apt-get install mcrypt php7.0-mcrypt > /dev/null 2>&1
echo "Restarting php7.0-fpm..."
sudo service php7.0-fpm restart > /dev/null 2>&1
And this is the nginx server block with the phpmyadmin configuration added:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name localhost;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
# Phpmyadmin Configurations
location /phpmyadmin {
root /usr/share/;
index index.php index.html index.htm;
location ~ ^/phpmyadmin/(.+\.php)$ {
try_files $uri =404;
root /usr/share/;
#fastcgi_pass 127.0.0.1:9000;
#fastcgi_param HTTPS on; # <-- add this line
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
root /usr/share/;
}
}
# Dealing with the uppercased letters
location /phpMyAdmin {
rewrite ^/* /phpmyadmin last;
}
location ~ /\.ht {
deny all;
}
}